package service

import (
	"douyin/models"
	"douyin/repository/mysql"

	"go.uber.org/zap"
	"golang.org/x/sync/errgroup"
)

// CommentAction 评论操作
func CommentAction(p *models.CommentRequest, userId int64) (err error) {
	g := new(errgroup.Group) //创建等待组
	ch := make(chan int64)
	//1.发布评论
	if p.ActionType == 1 {
		//创建评论
		g.Go(func() error {
			commentId, err := mysql.InsertComment(p.CommentText)
			ch <- commentId
			if err != nil {
				return err
			}
			return nil
		})
		commentId := <-ch   //阻塞
		if commentId != 0 { //创建评论成功
			//维护变量comment_count
			g.Go(func() error {
				if err := mysql.VideoCommentCount(p.VideoId, true); err != nil {
					return err
				}
				return nil
			})
			g.Go(func() error {
				//维护commentator表
				if err := mysql.InsertCommentator(p.VideoId, commentId, userId); err != nil {
					return err
				}
				return nil
			})
		}
		if err = g.Wait(); err != nil {
			zap.L().Error("service.Comment failed", zap.Error(err))
			return err
		}
	}
	//2.删除评论
	if p.ActionType == 2 {
		//Com表删除评论
		g.Go(func() error {
			if err := mysql.DeleteComment(p.CommentId); err != nil {
				return err
			}
			return nil
		})
		//维护变量comment_count
		g.Go(func() error {
			if err := mysql.VideoCommentCount(p.VideoId, false); err != nil {
				return err
			}
			return nil
		})
		//维护commentator表
		g.Go(func() error {
			if err := mysql.DeleteCommentator(p.VideoId, p.CommentId, userId); err != nil {
				return err
			}
			return nil
		})
		if err = g.Wait(); err != nil {
			zap.L().Error("service.Comment failed", zap.Error(err))
			return err
		}
	}
	return
}

// CommentList 一个视频的所有评论
func CommentList(videoId, userId int64) (commentList []models.Comment, err error) {
	//1.通过视频的Id,找到所有的commentId和对应的UserId
	commentatorIds, err := mysql.SelectCommentator(videoId)
	if err != nil {
		zap.L().Error("mysql.SelectCommentator Failed", zap.Error(err))
		return
	}
	//2.组合返回
	commentList, err = mysql.CombiComment(commentatorIds, userId)
	if err != nil {
		zap.L().Error("mysql.CombiComment Failed", zap.Error(err))
		return
	}
	return
}
